package com.cstor.liang.service;

import com.cstor.liang.mapper.GoMapper;
import com.github.pagehelper.PageHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

/**
 * Created by Administrator on 2017/10/16.
 */
@Transactional
public class BaseService<T> {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    //泛型参数的类型
    private Class<T> entityClass;
    @Autowired
    private GoMapper<T> mapper;

    public BaseService() {
        //通过反射来获取泛型参数的类型
        logger.info("当前实例化的类型为：" + getClass());
        Type superclass = getClass().getGenericSuperclass();
        logger.info("其泛型超类为：" + superclass);
        Type[] params = ((ParameterizedType)superclass).getActualTypeArguments();
        logger.info("实际的泛型类型参数为：" + params[0]);
        entityClass = (Class<T>)params[0];
    }

    /**
     * 新增一个对象
     * @param obj
     */
    public void insert(T obj){
        if (1 != mapper.insert(obj))
            throw new RuntimeException("添加失败");
    }

    /**
     * 新增一批对象（批量插入）
     * @param list
     * @return 成功添加的行数
     */
    public int insertList(List<T> list){
        return mapper.insertList(list);
    }

    /**
     * 根据id，删除对象
     * @param id 主键id
     * @return 被删除数据的行数
     */
    public int deleteByPrimaryKey(Object id){
        int row = mapper.deleteByPrimaryKey(id);
        if (row == 0)
            throw new RuntimeException("删除数据不存在！");
        return row;
    }

    /**
     * 更新
     * @param obj
     * @return 更新数据的行数
     */
    public int updateByPrimaryKey(T obj){
        int row = mapper.updateByPrimaryKey(obj);
        if (row == 0)
            throw new RuntimeException("更新数据不存在！");
        return row;
    }

    /**
     * 分页查询整个列表
     * @param pageIndex 页码，可为 null
     * @param pageSize 数量，可为 null
     * @return
     */
    @Transactional(readOnly = true)
    public List<T> getList(Integer pageIndex, Integer pageSize){
        if (null != pageIndex && null != pageSize)
            PageHelper.startPage(pageIndex, pageSize);
        return mapper.selectAll();
    }

    /**
     * 根据id，查询某个对象
     * @param id 主键id
     * @return
     */
    @Transactional(readOnly = true)
    public T getById(Object id){
        return mapper.selectByPrimaryKey(id);
    }

}
